package koby99;

public class J22_PrivateConstructor {
	
	// private으로 선언된 생성자
	// 일밙거으로 모든 생성자는 public 이어야함
	// 클래스에 대한 객체를 생성하려면
	// 반드시 필요한 것이 생성자이기 때문임
	
	// 하지만 , 어떤 생성자는 pruvate 으로 만들어서
	// new 연산자로 그들의 클래스가 객체화되지 못하게 하는 경우도 있음
	// private 생성자를 사용한 클래스를
	// singleton 클래스라 부름
	
	// 생성자는 private으로 선언
	// 객체변수는 pruvate static 으로 선언해서
	// 클래스의 객체를 메서드를 통해 접근 가능
	//

	public static void main(String[] args) {
		
		/*Singleton one = new singleton(); 
		Singleton two = new singleton(); 
		Singleton three = new singleton(); */
		Singleton one = Singleton.newInstance();
		Singleton two = Singleton.newInstance();
		Singleton three = Singleton.newInstance();
		
		
	}
}

class Singleton{
	
	static Singleton object = null;
	// object는 static 으로 선언되었기 때문에
	// 단 하나의 객체만 생성가능
	
	/*public singleton() {
		System.out.println("객체가 하나 만들어졌어요.");
	}*/ //일반적인 생성자
	private Singleton(){
		System.out.println("객체가 하나 만들어졌어요.");
	} 	//특수한 생성자
	
	/*public static Singleton newInstance(){
		Singleton object = new Singleton();
		return object;
	}*/ //생성자메서드는 일반메서드를 통해 호출

	public static Singleton newInstance(){
		if (object==null)object = new Singleton();
		// 객체가 만들어지지 않았다면 (object == null)
		// 객체를 하나 생성함(new Singleton)
		return object;
	}
}
	